# Copyright @ 2019 Alibaba. All rights reserved.
# Created by ruhuan on 2019.09.09
""" python OP API """
import MNNTools.MNN_FB.OpType as OpType
op_dict = {
    OpType.OpType.AbsVal : "AbsVal",
    OpType.OpType.QuantizedAdd : "QuantizedAdd",
    OpType.OpType.ArgMax : "ArgMax",
    OpType.OpType.AsString : "AsString",
    OpType.OpType.BatchNorm : "BatchNorm",
    OpType.OpType.BatchToSpaceND : "BatchToSpaceND",
    OpType.OpType.Bias : "Bias",
    OpType.OpType.BinaryOp : "BinaryOp",
    OpType.OpType.Bnll : "Bnll",
    OpType.OpType.Cast : "Cast",
    OpType.OpType.Concat : "Concat",
    OpType.OpType.Const : "Const",
    OpType.OpType.Convolution : "Convolution",
    OpType.OpType.ConvolutionDepthwise : "ConvolutionDepthwise",
    OpType.OpType.Crop : "Crop",
    OpType.OpType.CropAndResize : "CropAndResize",
    OpType.OpType.Cubic : "Cubic",
    OpType.OpType.Deconvolution : "Deconvolution",
    OpType.OpType.DeconvolutionDepthwise : "DeconvolutionDepthwise",
    OpType.OpType.Dequantize : "Dequantize",
    OpType.OpType.DetectionOutput : "DetectionOutput",
    OpType.OpType.Dropout : "Dropout",
    OpType.OpType.Eltwise : "Eltwise",
    OpType.OpType.ELU : "ELU",
    OpType.OpType.Embed : "Embed",
    OpType.OpType.Exp : "Exp",
    OpType.OpType.ExpandDims : "ExpandDims",
    OpType.OpType.Fill : "Fill",
    OpType.OpType.Flatten : "Flatten",
    OpType.OpType.FloorMod : "FloorMod",
    OpType.OpType.Gather : "Gather",
    OpType.OpType.GatherV2 : "GatherV2",
    OpType.OpType.Im2Seq : "Im2Seq",
    OpType.OpType.InnerProduct : "InnerProduct",
    OpType.OpType.Input : "Input",
    OpType.OpType.Interp: "Interp",
    OpType.OpType.Log: "Log",
    OpType.OpType.LRN: "LRN",
    OpType.OpType.LSTM: "LSTM",
    OpType.OpType.MatMul: "MatMul",
    OpType.OpType.MVN: "MVN",
    OpType.OpType.NonMaxSuppression: "NonMaxSuppression",
    OpType.OpType.NonMaxSuppressionV2: "NonMaxSuppressionV2",
    OpType.OpType.Normalize: "Normalize",
    OpType.OpType.Pack: "Pack",
    OpType.OpType.Padding: "Padding",
    OpType.OpType.Permute: "Permute",
    OpType.OpType.Pooling: "Pooling",
    OpType.OpType.Power: "Power",
    OpType.OpType.PReLU: "PReLU",
    OpType.OpType.PriorBox: "PriorBox",
    OpType.OpType.Proposal: "Proposal",
    OpType.OpType.QuantizedAvgPool: "QuantizedAvgPool",
    OpType.OpType.QuantizedBiasAdd: "QuantizedBiasAdd",
    OpType.OpType.QuantizedConcat: "QuantizedConcat",
    OpType.OpType.QuantizedDepthwiseConv2D: "QuantizedDepthwiseConv2D",
    OpType.OpType.QuantizedLogistic: "QuantizedLogistic",
    OpType.OpType.QuantizedMatMul: "QuantizedMatMul",
    OpType.OpType.QuantizedMaxPool: "QuantizedMaxPool",
    OpType.OpType.QuantizedRelu: "QuantizedRelu",
    OpType.OpType.QuantizedRelu6: "QuantizedRelu6",
    OpType.OpType.QuantizedReshape: "QuantizedReshape",
    OpType.OpType.QuantizedSoftmax: "QuantizedSoftmax",
    OpType.OpType.QuantizeMaxMin: "QuantizeMaxMin",
    OpType.OpType.QuantizeV2: "QuantizeV2",
    OpType.OpType.Range: "Range",
    OpType.OpType.Rank: "Rank",
    OpType.OpType.ReduceJoin: "ReduceJoin",
    OpType.OpType.Reduction: "Reduction",
    OpType.OpType.ReLU: "ReLU",
    OpType.OpType.ReLU6: "ReLU6",
    OpType.OpType.RequantizationRange: "RequantizationRange",
    OpType.OpType.Requantize: "Requantize",
    OpType.OpType.Reshape: "Reshape",
    OpType.OpType.Resize: "Resize",
    OpType.OpType.RNN: "RNN",
    OpType.OpType.ROIPooling: "ROIPooling",
    OpType.OpType.Scale: "Scale",
    OpType.OpType.Selu: "Selu",
    OpType.OpType.Seq2Out: "Seq2Out",
    OpType.OpType.Shape: "Shape",
    OpType.OpType.Sigmoid: "Sigmoid",
    OpType.OpType.Size: "Size",
    OpType.OpType.Slice: "Slice",
    OpType.OpType.SliceTf: "SliceTf",
    OpType.OpType.Softmax: "Softmax",
    OpType.OpType.SpaceToBatchND: "SpaceToBatchND",
    OpType.OpType.SpatialProduct: "SpatialProduct",
    OpType.OpType.Split: "Split",
    OpType.OpType.SPP: "SPP",
    OpType.OpType.Squeeze: "Squeeze",
    OpType.OpType.StridedSlice: "StridedSlice",
    OpType.OpType.StringJoin: "StringJoin",
    OpType.OpType.StringSplit: "StringSplit",
    OpType.OpType.StringToNumber: "StringToNumber",
    OpType.OpType.TanH: "TanH",
    OpType.OpType.TfQuantizedConv2D: "TfQuantizedConv2D",
    OpType.OpType.Threshold: "Threshold",
    OpType.OpType.Tile: "Tile",
    OpType.OpType.TopKV2: "TopKV2",
    OpType.OpType.Transpose: "Transpose",
    OpType.OpType.UnaryOp: "UnaryOp",
    OpType.OpType.Unpack: "Unpack",
    OpType.OpType.Where: "Where",
    OpType.OpType.Moments: "Moments",
    OpType.OpType.RNNSequenceGRU: "RNNSequenceGRU",
    OpType.OpType.BatchMatMul: "BatchMatMul",
    OpType.OpType.Unsqueeze: "Unsqueeze",
    OpType.OpType.CosineSimilarity: "CosineSimilarity",
    OpType.OpType.DepthToSpace: "DepthToSpace",
    OpType.OpType.SpaceToDepth: "SpaceToDepth",
    OpType.OpType.ReverseSequence: "ReverseSequence",
    OpType.OpType.Pooling3D: "Pooling3D", 
    OpType.OpType.Convolution3D: "Convolution3D",
    OpType.OpType.MaxLayerCount: "MaxLayerCount",
    OpType.OpType.ConvertTensor: "ConvertTensor",
    OpType.OpType.PLUGIN: "PLUGIN",
    OpType.OpType.Select: "Select",
    OpType.OpType.ZerosLike: "ZerosLike",
    OpType.OpType.Broastcast: "Broastcast",
    OpType.OpType.SetDiff1D: "SetDiff1D",
    OpType.OpType.ReluGrad: "ReluGrad",
    OpType.OpType.Relu6Grad: "Relu6Grad",
    OpType.OpType.PoolGrad: "PoolGrad",
    OpType.OpType.SoftmaxGrad: "SoftmaxGrad",
    OpType.OpType.Conv2DBackPropFilter: "Conv2DBackPropFilter",
    OpType.OpType.Extra: "Extra",
    OpType.OpType.ConvInt8: "ConvInt8",
    OpType.OpType.Int8ToFloat: "Int8ToFloat",
    OpType.OpType.DepthwiseConvInt8: "DepthwiseConvInt8",
    OpType.OpType.PoolInt8: "PoolInt8",
    OpType.OpType.FloatToInt8: "FloatToInt8",
    OpType.OpType.EltwiseInt8: "EltwiseInt8"
}
def optype_to_name(op_type):
    """convert from op type to op name """
    if op_type in op_dict:
        return op_dict[op_type]
    return "NA"
